<?php

class shoestringDatabaseObject {
    
    private static $shoestringObject;
    private $databaseEngine;
    
    private function __construct() {
        # private zodat we geen objecten kunnen aanmaken zonder singelton 
    }
    
    # Singletonpatroon om zeker te zijn dat er slechts 1 object kan bestaan
    public static function instantiateShoestring() {
        
        if (!isset(self::$shoestringObject)) {
            self::$shoestringObject = new shoestringDatabaseObject();
        }
        return self::$shoestringObject;
        
    }
    
    private function getDatabaseEngine() {
        return new databaseEngine();
    }
    
    private function createRowArray($result) {
        $rows = array();
        while($row = mysql_fetch_assoc($result)) {
            $rows[] = $row;
        }
        return $rows;
    }
    
    public function getReizen() {
        
        $database = $this->getDatabaseEngine();
        
        $query = 'SELECT r.reis_id, l.land, r.reistype as titel, r.aantaldagen, r.beschrijving, r.image 
            FROM reis r 
            INNER JOIN planning p ON (p.reis_id = r.reis_id)
            INNER JOIN land l ON (r.land_id = l.land_id)
            WHERE p.startdatum > now()';
        
        $result = $database->runQuery($query);
        $rows = $this->createRowArray($result);
        
        return $rows;
        
    }
    
    public function getAanbiedingen() {
        
        $database = $this->getDatabaseEngine();
        
        # Deze query levert alleen resultaat op als een reis een planning heeft
        $query = 'SELECT r.reis_id, MIN(p.prijs_vlucht + prijs_vervoer + prijs_overnachtingen + prijs_gids + prijs_eten + boekings_kosten + luchthavenbelasting) AS prijsVanaf, r.beschrijving, r.image 
            FROM reis r 
            INNER JOIN land l ON (r.land_id = l.land_id)
            INNER JOIN planning p ON (r.reis_id = p.reis_id)
            WHERE p.startdatum > now()
            GROUP BY reis_id
            ORDER BY Rand() LIMIT 6';
        
        $result = $database->runQuery($query);
        $rows = $this->createRowArray($result);
        
        return $rows;
    }
    
    public function getReis($reisID) {
        
        $database = $this->getDatabaseEngine();
        
        $query = 'SELECT r.reis_id, l.land, r.reistype as titel, r.aantaldagen, r.beschrijving, r.image, r.max_leeftijd 
            FROM reis r 
            INNER JOIN land l ON (r.land_id = l.land_id)
            WHERE r.reis_id = ' . mysql_real_escape_string($reisID);
        
        $result = $database->runQuery($query);
        $rows = mysql_fetch_assoc($result);
        return $rows;
        
    }
    
    public function getReisPlanning($reisID) {
        
        $database = $this->getDatabaseEngine();
        
        $query = 'SELECT planning_id, reis_id, startdatum, einddatum, min_deelnemers, max_deelnemers, vertrekpunt, (p.prijs_vlucht + prijs_vervoer + prijs_overnachtingen + prijs_gids + prijs_eten + boekings_kosten + luchthavenbelasting) as prijs FROM planning p
            WHERE p.reis_id = ' . mysql_real_escape_string($reisID) . '
            AND p.startdatum > now()';
        
        $result = $database->runQuery($query);
        $rows = $this->createRowArray($result);
        
        return $rows;
        
    }
    
    public function addPersoon($persoon) {
        
        $database = $this->getDatabaseEngine();
        
        $fieldnames = array();
        $values = array();
        foreach($persoon as $fieldname => $value) {
            $fieldnames[] = mysql_real_escape_string($fieldname);
            $values[] = '"'.mysql_real_escape_string($value).'"';
        } 
        
        $query = 'INSERT INTO persoon ('.implode(',',$fieldnames).') VALUES ('.implode(',',$values).')';
        
        $database->runQuery($query);
        
        $newPersoonID = mysql_insert_id();
        
        return $newPersoonID;
        
    }
    
    public function addReservering($reservering) {
        
        $database = $this->getDatabaseEngine();
        
        $fieldnames = array();
        $values = array();
        foreach($reservering as $fieldname => $value) {
            $fieldnames[] = mysql_real_escape_string($fieldname);
            $values[] = '"'.mysql_real_escape_string($value).'"';
        } 
        
        $query = 'INSERT INTO reservering ('.implode(',',$fieldnames).') VALUES ('.implode(',',$values).')';
        
        $database->runQuery($query);
        $newReserveringID = mysql_insert_id();
        
        return $newReserveringID;
        
    }
    
    public function addDeelnemer($deelnemer) {
        
        $database = $this->getDatabaseEngine();
        
        $fieldnames = array();
        $values = array();
        foreach($deelnemer as $fieldname => $value) {
            $fieldnames[] = mysql_real_escape_string($fieldname);
            $values[] = '"'.mysql_real_escape_string($value).'"';
        } 
        
        $query = 'INSERT INTO deelnemer ('.implode(',',$fieldnames).') VALUES ('.implode(',',$values).')';
        
        $database->runQuery($query);
        $newReserveringID = mysql_insert_id();
        
        return $newReserveringID;
        
    }
    
    public function getBeschikbaar($planningID) {
    	$database = $this->getDatabaseEngine();
    	 
    	$query = "SELECT planning.max_deelnemers - count(persoon_id) as beschikbaar FROM planning
					join reservering on reservering.planning_id=planning.planning_id
					join deelnemer on reservering.reservering_id=deelnemer.reservering_id
					where planning.planning_id=".$planningID." and reservering.canceldatum IS NULL";
        $result = $database->runQuery($query);
		$rows = mysql_fetch_assoc($result);
		return $rows["beschikbaar"];
    }
    
    public function reizenZoeken($instellingen) {
       
        $aantalPaginas = 0;
        $database = $this->getDatabaseEngine();
        
        $query = 'SELECT r.reis_id, l.land, r.reistype, r.aantaldagen, r.beschrijving, r.image 
            FROM reis r 
                INNER JOIN land l ON (r.land_id = l.land_id)
            WHERE 1 = 1 ';
        
        if(isset($_SESSION['zoekterm'])) {
            $query .= 'AND (r.reistype LIKE "%'.mysql_real_escape_string($_SESSION['zoekterm']).'%" OR r.beschrijving LIKE "%'.mysql_real_escape_string($_SESSION['zoekterm']).'%" OR l.land LIKE "%'.mysql_real_escape_string($_SESSION['zoekterm']).'%") ';
        }
        
        # De query draaien zonder limit om te bepalen hoeveel records in totaal uit deze query komen rollen
        $result = $database->runQuery($query);
        
        # We gaan bepalen of er paginatie nodig is
        if(isset($instellingen['maxRecords'])) {
            
            # Aantal gevonden records tellen
            $aantalRecords = mysql_num_rows($result);
            
            # Bereken hoeveelheid pagina's
            if($aantalRecords > $instellingen['maxRecords']) {
                $aantalPaginas = ceil($aantalRecords / $instellingen['maxRecords']);
            }
            
        }
        
        # In geval er een limit op hoeveelheid records per pagina is ingesteld een limit instellen op de query
        if(isset($instellingen['maxRecords'])) {
            
            $startLimit = 0;
            if(isset($_SESSION['zoekpagina'])) {
                $startLimit = $_SESSION['zoekpagina'] * $instellingen['maxRecords'];
            }
            
            $query .= 'LIMIT '.mysql_real_escape_string($startLimit).', ' . $instellingen['maxRecords'];
            
        }
        
        # De complete query draaien met LIMIT
        $result = $database->runQuery($query);
        
        # Omzetten naar een array
        $rows = $this->createRowArray($result);
        
        return array('rows'=>$rows, 'aantalPaginas'=>$aantalPaginas);
        
    }
    
}
    
?>
